package pessoas.presenter;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.JOptionPane;
import pessoas.collection.Contatos;
import pessoas.collection.Operadoras;
import pessoas.model.Contato;
import pessoas.model.Usuario;
import pessoas.view.ManterContatoView;

public final class ManterContatoPresenter {

    Contatos contatos;
    private ManterContatoView view;
    private Contato contato;
    private Operadoras operadoras;
    private Usuario usuario;

    public ManterContatoPresenter(Usuario usuario, Contatos contatos, Contato contato) {

        this.contatos = contatos;
        view = new ManterContatoView(null, true);
        this.contato = contato;
        this.usuario = usuario;
        try {
            this.operadoras = new Operadoras();
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(view, ex.getMessage());
        }

        view.getComboOper().setEnabled(false);
        // view.getComboUf().setEnabled(false);
        view.getComboUf().setOpaque(true);

        if (contato != null) {
            view.getBtnSalvar().setText("Editar");
            view.getTxtNome().setText(contato.getNome());
            view.getTxtSobrenome().setText(contato.getSobrenome());
            String tel = contato.getTelefone().substring(4, 8) + contato.getTelefone().substring(9);
            if (tel.length() == 8) {
                view.getTxtTelefone().setText(contato.getTelefone().substring(0, 4) + contato.getTelefone().substring(4));
            } else {
                view.getTxtTelefone().setText(contato.getTelefone().substring(0, 4) + contato.getTelefone().substring(5));
            }
            view.getComboUf().setSelectedItem(contato.getUf());
            view.getComboOper().setSelectedItem(contato.getOperadora());
            view.getBtnSalvar().addActionListener(new java.awt.event.ActionListener() {

                @Override
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    try {
                        btnEditarPessoa();
                    } catch (Exception ex) {
                        JOptionPane.showMessageDialog(view, ex.getMessage());

                    }
                }
            });
        } else {
            view.getBtnSalvar().addActionListener(new java.awt.event.ActionListener() {

                @Override
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    try {
                        btnSalvarPessoa();
                    } catch (Exception ex) {
                        JOptionPane.showMessageDialog(view, ex.getMessage());
                    }
                }
            });
        }
        view.getTxtTelefone().addKeyListener(new KeyAdapter() {

            @Override
            public void keyReleased(KeyEvent e) {
                atualizaUFOperadoras();
            }
        });

        view.getBtnFechar().addActionListener(new java.awt.event.ActionListener() {

            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                view.setVisible(false);
                view.dispose();
            }
        });

        view.setLocationRelativeTo(view);
        view.setVisible(true);
    }

    public void atualizaUFOperadoras() {
        String tel = view.getTxtTelefone().getText().substring(1, 3) + view.getTxtTelefone().getText().substring(4);
        tel = tel.replace(" ", "").replace("-", "");
        if (tel.length() == 10) {
            try {
                String nome = view.getTxtNome().getText();
                String sobrenome = view.getTxtSobrenome().getText();
                String telefone = view.getTxtTelefone().getText();
                Contato contato = new Contato(nome, sobrenome, telefone, null, null);
                contato = operadoras.detectaUfOperadora(contato);
                if (contato == null) {
                    throw new Exception("Insira um DDD válido !!");
                }
                view.getComboUf().setSelectedItem(contato.getUf());
                view.getComboOper().setSelectedItem(contato.getOperadora());
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(null, ex.getMessage());
            }
        }

    }

    public void btnEditarPessoa() throws Exception {
        try {
            String nome = view.getTxtNome().getText();
            String sobrenome = view.getTxtSobrenome().getText();
            Object telefone = view.getTxtTelefone().getValue();
            if (telefone == null) {
                telefone = contato.getTelefone();
            }
            Contato contato = new Contato(nome, sobrenome, String.valueOf(telefone), null, null);

            //--------------verificaçao da uf e operadora---------------
            contato = operadoras.detectaUfOperadora(contato);

            if ((!nome.equals("")) && (!sobrenome.equals("")) && (telefone != null)) {
                if (contatos.verificaContato(contato)) {
                    throw new Exception("O contato já existe !!");
                }
                contatos.editarContato(this.contato, contato);
                contatos.gravarLog("<Edição> do contato <<" + contato.getNome() + ">>,<<" + getHora() + ">>,<<" + getData()
                        + ">>,<<" + this.usuario.getNomeUsuario() + ">>.");
                JOptionPane.showMessageDialog(view, nome + " " + sobrenome + " Alterado com sucesso!");
                view.dispose();

            } else {
                throw new IllegalArgumentException("Você precisa informar os campos");
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(view, ex.getMessage());
            contatos.gravarLog("Ocorreu a falha:" + ex.getMessage() + "ao realizar <Edição> do contato <<" + contato.getNome() + ">>,<<" + getHora() + ">>,<<" + getData()
                    + ">>,<<" + this.usuario.getNomeUsuario() + ">>.");
        }
    }

    public void btnSalvarPessoa() throws Exception, IOException {
        try {
            String nome = view.getTxtNome().getText();
            String sobrenome = view.getTxtSobrenome().getText();
            Object telefone = view.getTxtTelefone().getValue();
            Contato contato = new Contato(nome, sobrenome, String.valueOf(telefone), null, null);

            //--------------verificaçao da uf e operadora---------------        
            contato = operadoras.detectaUfOperadora(contato);

            if ((!nome.equals("")) && (!sobrenome.equals("")) && (telefone != null)) {
                if (contatos.verificaContato(contato)) {
                    throw new Exception("O contato já existe !!");
                }
                contatos.salvarContato(contato);
                contatos.gravarLog("<Inclusão> do contato <<" + contato.getNome() + ">>,<<" + getHora() + ">>,<<" + getData()
                        + ">>,<<" + this.usuario.getNomeUsuario() + ">>.");
                JOptionPane.showMessageDialog(view, nome + " " + sobrenome + " Cadastrado com sucesso!");
                view.getTxtNome().setText("");
                view.getTxtSobrenome().setText("");
                view.getTxtTelefone().setText("");
                view.getComboUf().setSelectedIndex(0);
                view.getComboOper().setSelectedIndex(0);

            } else {
                throw new IllegalArgumentException("Você precisa informar os campos");
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(view, ex.getMessage());
            contatos.gravarLog("Ocorreu a falha:" + ex.getMessage() + "ao realizar <Inclusão> do contato <<" + contato.getNome() + ">>,<<" + getHora() + ">>,<<" + getData()
                    + ">>,<<" + this.usuario.getNomeUsuario() + ">>.");
        }
    }

    public String getHora() {
        StringBuilder sb = new StringBuilder();
        GregorianCalendar d = new GregorianCalendar();
        sb.append(d.get(GregorianCalendar.HOUR_OF_DAY));
        sb.append(":");
        sb.append(d.get(GregorianCalendar.MINUTE));
        sb.append(":");
        sb.append(d.get(GregorianCalendar.SECOND));
        return sb.toString();
    }

    public String getData() {
        Calendar data = Calendar.getInstance();
        Date d = data.getTime();
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        dateFormat.format(d);
        return d.toLocaleString().substring(0, 10);
    }

    public ManterContatoView getView() {
        return view;
    }
}
